﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;

namespace WFAPasswordRegExp
{
	public static class Password
	{

		public static bool validar(string senha)
		{
			bool retorno = false;

			bool hasNumber = false;
			bool hasLower = false;
			bool hasUpper = false;
			bool hasSpecial = false;

			Regex erNumber = new Regex(@"[A-Z]", RegexOptions.None);
			Regex erLower = new Regex(@"[a-z]", RegexOptions.None);
			Regex erUpper = new Regex(@"[0-9]", RegexOptions.None);
			Regex erSpecial = new Regex(@"\W", RegexOptions.None);

			if (erNumber.IsMatch(senha))
			{
				hasNumber = true;
			}

			if (erLower.IsMatch(senha))
			{
				hasLower = true;
			}

			if (erUpper.IsMatch(senha))
			{
				hasUpper = true;
			}

			if (erSpecial.IsMatch(senha))
			{
				hasSpecial = true;
			}

			if (hasNumber && hasLower && hasUpper && hasSpecial)
			{
				retorno = true;
			}

			return retorno;
		}

		public static Feedback verificar(string senha, bool haveNumber, bool haveSpecial, bool haveUpper, bool haveLower)
		{
			Feedback feedback = new Feedback();

			bool ehValido = true;
			StringBuilder mensagem = new StringBuilder("A senha deve conter: ", 255);

			bool temNumero = false;
			bool temEspecial = false;
			bool temMaiusculo = false;
			bool temMinusculo = false;

			if (haveNumber)
				temNumero = contemNumero(senha);

			if (haveSpecial)
				temEspecial = contemCaracterEspecial(senha); 

			if (haveUpper)
				temMaiusculo = contemCaracterMaiusculo(senha);

			if (haveLower)
				temMinusculo = contemCaracterMinusculo(senha);

			if (haveNumber == true && temNumero != true)
			{
				mensagem.Append("1 caracter numérico, ");
				ehValido = temNumero;
			}

			if (haveSpecial == true && temEspecial != true)
			{
				mensagem.Append("1 caracter especial, ");
				ehValido = temEspecial;
			}

			if (haveUpper == true && temMaiusculo != true)
			{
				mensagem.Append("1 caracter maiúsculo, ");
				ehValido = temMaiusculo;
			}

			if (haveLower == true && temMinusculo != true)
			{
				mensagem.Append("1 caracter minúsculo, ");
				ehValido = temMinusculo;
			}

			feedback.Status = ehValido;
			feedback.Message = mensagem.ToString(0, mensagem.Length - 2);

			return feedback;
		}

		public static bool contemNumero(string senha)
		{
			bool hasNumber = false;

			Regex erNumber = new Regex(@"[0-9]", RegexOptions.None);

			if (erNumber.IsMatch(senha))
			{
				hasNumber = true;
			}

			return hasNumber;
		}

		public static bool contemCaracterMinusculo(string senha)
		{
			bool hasLower = false;

			Regex erLower = new Regex(@"[a-z]", RegexOptions.None);

			if (erLower.IsMatch(senha))
			{
				hasLower = true;
			}

			return hasLower;
		}

		public static bool contemCaracterMaiusculo(string senha)
		{
			bool hasUpper = false;

			Regex erUpper = new Regex(@"[A-Z]", RegexOptions.None);

			if (erUpper.IsMatch(senha))
			{
				hasUpper = true;
			}

			return hasUpper;
		}

		public static bool contemCaracterEspecial(string senha)
		{
			bool hasSpecial = false;

			Regex erSpecial = new Regex(@"\W", RegexOptions.None);

			if (erSpecial.IsMatch(senha))
			{
				hasSpecial = true;
			}

			return hasSpecial;
		}

		public static Feedback verficarQtdeCaracter(string password, int limiteMinino)
		{
			Feedback feedback = new Feedback();
			if (password.Length < limiteMinino)
			{
				feedback.Message = "Senha deve conter ao menos " + limiteMinino + " caracteres!";
			}
			else
			{
				feedback.Status = true;
			}

			return feedback;
		}

	}
}
